//Pinbelegungen

int pumpe1 = 12;
int pumpe2 = 11;

int statusled = 13;                                               // Achtung! LED's lassen sich nur an Pin 13 ohne Vorwiderstand anschließen.
int temperaturfuehler = 0;
int heizelement = 10;
int niveaufuehler1 = 9;
int niveaufuehler2 = 8;

int schalter = 7;                                                // Alle Taster müssen mit einem Pull-Down-Widerstand beschaltet werden um ungewolltes Auslösen zu verhindern!

//Pinbelegunen Ende

int zieltemperatur = 95;                                          // Wie viel °C soll das Wasser haben?
int pumpenlaufzeit = 10;                                          // Wie lange sollen die Pumpen laufen?

int messdivisor = 10;                                             // Der Messdivisor ist bei Temperaturfuehlern unterschiedlich. Hier wird von einem LM35 ausgegangen dessen Spannung pro Grad Celsius um 10mV zunimmt.
int messsubtrahend = 3;                                           // Um wie viel °C darf die zeiltemperatur unterschritten werden bevor sich das Heizelement wieder einschaltet?

void setup(){
  
  Serial.begin(9600);                                             // Werte wie die Temperatur werden über eine Serielle Konsole ausgegeben. Es wäre empfehlenswert einen USB-Anschluss nach Außen zu verlegen.
  
  pinMode(pumpe1, OUTPUT);
  pinMode(pumpe2, OUTPUT);
  pinMode(statusled, OUTPUT);
  pinMode(heizelement, OUTPUT);
  pinMode(schalter, INPUT);
  pinMode(niveaufuehler1, INPUT);
  pinMode(niveaufuehler2,INPUT);
}

void loop(){                                                      // Die Hauptfunktion ruft mehr oder weniger nur die vorher definierten Funktionen auf.

  int val = 0;

  Serial.println("Beginne mit Programm");
  
  fuellstand();
  aufheizen();
  
  Serial.println("Bereit zum Kaffee kochen");
  
  while(fuehler() >= zieltemperatur - messsubtrahend){
   if(val == 1){ 
      digitalWrite(pumpe1, HIGH);
    }
    else digitalWrite(pumpe1, LOW);
    
    val = digitalRead(schalter);
  }
}
int fuehler(){                                                     // Diese Funktion misst die Temperatur und gibt sie als Rückgabewert zurück.
  
  int x;
  int y;
  
  x = analogRead(temperaturfuehler);
  y = x / messdivisor;
  return(y);                         
}
  
void aufheizen(){                                                  // Diese Funktion steuert das Heizelement und die regelt die Temperatur.

  while(fuehler() <= zieltemperatur){
    digitalWrite(heizelement, HIGH);
    digitalWrite(statusled, HIGH);                                 // Die Statusled stellt sich aus sobald die gewünschte Temperatur ewrreicht ist.
    Serial.println(fuehler());
}
  digitalWrite(heizelement, LOW);
  Serial.println("Zieltemperatur OK");
  digitalWrite(statusled, LOW);
}

void fuellstand(){                                                 // Misst den Füllstand anhand von zwei Sensoren.   
  
  if(digitalRead(niveaufuehler1) == LOW){
    Serial.println("Fuellstand niedrig");
    while(digitalRead(niveaufuehler2) == LOW){
      digitalWrite(statusled, HIGH);
      digitalWrite(pumpe2, HIGH);
    }
    digitalWrite(pumpe2, LOW);
    digitalWrite(statusled, LOW);
  }
  Serial.println("Fuellstand OK");
}
 
    
  
  
